package com.sky.exception;

import com.sky.utils.R;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局异常处理类，用于处理SkyMall模块中发生的异常。
 * 使用@RestControllerAdvice注解标识该类为异常处理的中心控制器，可以处理所有控制器层的异常。
 * @author Administrator
 */
@RestControllerAdvice
public class SkyMallExceptionControllerAdvice {

    /**
     * 处理方法参数验证异常。
     * 当请求参数不满足验证条件时，会抛出MethodArgumentNotValidException异常。
     * 此方法捕获该异常并返回相应的错误信息。
     *
     * @param e MethodArgumentNotValidException异常实例，包含验证失败的详细信息。
     * @return 返回一个包含错误信息的R对象，错误码为VALID_EXCEPTION，错误详情为参数验证失败的信息。
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R handleSkyMallValidationException(MethodArgumentNotValidException e) {
        // 创建一个Map来存储字段错误信息。
        Map<String,String> errorMap = new HashMap<>();
        // 遍历异常中包含的所有字段错误，将字段名和错误信息添加到errorMap中。
        e.getBindingResult().getFieldErrors().forEach(fieldError -> {
            String field = fieldError.getField();
            String defaultMessage = fieldError.getDefaultMessage();
            errorMap.put(field,defaultMessage);
        });
        // 返回一个包含错误码、错误消息和字段错误详情的R对象。
        return R.error(BizCodeEnum.VALID_EXCEPTION.hashCode(),BizCodeEnum.VALID_EXCEPTION.getMsg(),errorMap);
    }

    /**
     * 处理所有未被其他异常处理器捕获的异常。
     * 该方法作为一个兜底的异常处理方法，捕获任何Throwable类型的异常。
     *
     * @param throwable 抛出的异常实例，可以是任何类型的异常。
     * @return 返回一个包含错误信息的R对象，错误码为UNKONW_EXCEPTION，错误详情为异常的消息。
     */
//    @ExceptionHandler(Throwable.class)
//    public R handleException(Throwable throwable) {
//        // 获取异常的消息。
//        String message = throwable.getMessage();
//        // 返回一个包含错误码和异常消息的R对象。
//        return R.error(BizCodeEnum.UNKONW_EXCEPTION.getCode(),message);
//    }
}

